home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / lib / memory / setmem.a < prev    next >
Text File  |  1994-02-01  |  2KB  |  106 lines

  1.  
  2.         ;   SETMEM.A
  3.         ;
  4.         ;   (c)Copyright 1990, Matthew Dillon, All Rights Reserved
  5.  
  6.         section text,CODE
  7.  
  8.         ;   setmem(buffer, len, byte)
  9.         ;     4(sp)   ...
  10.         ;       A0       D0     D1    (DICE-REG)
  11.         ;       A0       D0     D1    (internal)
  12.         ;   clrmem(buffer, len)
  13.         ;   bzero(buffer, len)
  14.         ;      4(sp) ...
  15.         ;        A0      D0           (DICE-REG)
  16.         ;        A0      D0           (internal)
  17.  
  18.  
  19.         xdef    _setmem
  20.         xdef    _clrmem
  21.         xdef    _bzero
  22.         xdef    @setmem
  23.         xdef    @clrmem
  24.         xdef    @bzero
  25.         xdef    _hyper_setmem
  26.         xdef    _hyper_clrmem
  27.         xdef    _hyper_bzero
  28.  
  29. @bzero:
  30. @clrmem
  31.         clr.l    D1        ; value
  32.         bra    @setmem
  33.  
  34. _hyper_bzero:
  35. _hyper_clrmem:
  36. _bzero:
  37. _clrmem:    moveq.l #0,D1
  38.         bra    xbz0
  39. _hyper_setmem
  40. _setmem:    move.b    12+3(sp),D1
  41. xbz0        move.l    4(sp),A0
  42.         move.l    8(sp),D0
  43.  
  44. @setmem
  45.         add.l    D0,A0        ; start at end of address
  46.         cmp.l    #40,D0        ; unscientifically chosen
  47.         bls    xbs2
  48.         bra    xbs10
  49. xbs1        move.b    D1,-(A0)    ; any count < 65536
  50. xbs2        dbf    D0,xbs1
  51.         move.l    4(sp),D0
  52.         rts
  53.  
  54.                     ; at least 4 bytes in count (D0)
  55. xbs10        movem.l D2-D7/A2-A6,-(sp)   ;any count > 4
  56.         move.w    A0,D2
  57.         lsr.l    #1,D2        ; is it aligned?
  58.         bcc    xbs22
  59.         move.b    D1,-(A0)    ; no, copy one byte
  60.         subq.l    #1,D0
  61.  
  62. xbs22        andi.l    #$FF,D1     ; expand data D1.B -> D2-D7/A1-A6
  63.         move.l    D1,D2        ; D1 000000xx   D2 000000xx
  64.         asl.w    #8,D2        ;               0000xx00
  65.         or.w    D2,D1        ;     0000xxxx
  66.         move.w    D1,D2        ;     0000xxxx      0000xxxx
  67.         swap    D2        ;     0000xxxx      xxxx0000
  68.         or.l    D1,D2        ; D2.L
  69.         move.l    D2,D3
  70.         move.l    D2,D4
  71.         move.l    D2,D5
  72.         move.l    D2,D6
  73.         move.l    D2,D7
  74.         move.l    D2,A1
  75.         move.l    D2,A2
  76.         move.l    D2,A3
  77.         move.l    D2,A4
  78.         move.l    D2,A5
  79.         move.l    D2,A6        ; D2-D7/A1-A6   (12 registers)
  80.         move.l    #48,D1        ; bytes per transfer (48)
  81. xbs30        sub.l    D1,D0        ; pre subtract
  82.         bmi    xbs40
  83. xbs31        movem.l D2-D7/A1-A6,-(A0)
  84.         sub.l    D1,D0
  85.         bpl    xbs31
  86. xbs40        add.w    D1,D0        ; less than 48 bytes remaining
  87.  
  88.         move.w    #4,D1        ; by 4's
  89.         sub.w    D1,D0
  90.         bmi    xbs50
  91. xbs41        move.l    D2,-(A0)
  92.         sub.w    D1,D0
  93.         bpl    xbs41
  94. xbs50        add.w    D1,D0
  95.         bra    xbs52
  96. xbs51        move.b    D2,-(A0)    ; by 1's
  97. xbs52        dbf    D0,xbs51
  98.         movem.l (sp)+,D2-D7/A2-A6
  99.         move.l    4(sp),D0
  100.         rts
  101.  
  102.         END
  103.  
  104.  
  105.  
  106.